//addr ==  UART_ADDR  --> uart
//addr ==  LED_ADDR   --> led ( w_post_code )
//clock  150m
module intel_espi2uart(/*autoarg*/
   // Outputs
   tx_en, tx_data, w_post_code,
   // Inputs
   clk, rst, tx_rdy, rx_vld, rx_data, rx_err, io_reset, io_address,
   io_write, io_read, io_writedata
   );

parameter  UART_ADDR = 16'h03f8 ;
parameter  LED_ADDR  = 16'h0080 ;

parameter  UART_FIFO_DEPTH =  6            ;
parameter  UART_FIFO_MAX   = (1<<UART_FIFO_DEPTH) -2  ;


input         clk ;
input         rst ;

//to uart 
output wire         tx_en    ;
output wire  [7:0]  tx_data  ;
input               tx_rdy   ;

output      [ 7:0]   w_post_code ;

//from uart
input         rx_vld    ;
input  [7:0]  rx_data   ;
input         rx_err    ;


input          io_reset   ;
input  [15:0]  io_address ;
input          io_write   ;  
input          io_read    ; 
input  [ 7:0]  io_writedata;


//////////////////////////////////////////////////////////////////////////////////////////////////

reg         [ 7:0]   w_post_code ;


//////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////

wire  [7:0]                 uart_fifo_out   ;
wire  [UART_FIFO_DEPTH:0]   uart_fifo_usedw ;
wire                        uart_fifo_empty ;

reg                         uart_fifo_we    ;
reg   [7:0]                 uart_fifo_din   ;

wire                        uart_fifo_re    ;

fifo #( 8 ,  UART_FIFO_DEPTH  ,  0 )  u_uart_fifo(
   // Outputs
   .fifo_out    (uart_fifo_out), 
   .fifo_usedw  (uart_fifo_usedw),
   .fifo_empty  (uart_fifo_empty),
   // Inputs
   .clk         (clk ), 
   .rst_n       (~rst), 
   .fifo_clr    (1'b0), 
   .fifo_we     (uart_fifo_we), 
   .fifo_in     (uart_fifo_din), 
   .fifo_re     (uart_fifo_re)
   );

always@ ( posedge rst  or posedge clk)
begin
  if ( rst ) begin
     uart_fifo_we  <=  2'd0 ;
  end
  else if ( uart_fifo_usedw<=UART_FIFO_MAX  )  begin 
     uart_fifo_we  <=   io_write &&  (  io_address == UART_ADDR)    ;
  end
  else begin
     uart_fifo_we  <=  2'd0 ;
  end
end

always@ ( posedge rst  or posedge clk)
begin
  if ( rst ) begin
     uart_fifo_din  <=  2'd0 ;
  end
  else if (  io_write &&  (  io_address == UART_ADDR)    )  begin
     uart_fifo_din  <=    io_writedata  ;
  end
end

assign   uart_fifo_re = tx_rdy && (~uart_fifo_empty) ;
assign   tx_en        = tx_rdy && (~uart_fifo_empty) ;
assign   tx_data      = uart_fifo_out                ;


////////////////////////////////////////////////////////////////////////

//w_post_code


always@ ( posedge rst  or posedge clk)
begin
  if ( rst ) begin
     w_post_code  <=  'd0 ;
  end
  else if (  io_write &&  (  io_address ==  LED_ADDR  )    )  begin
 	w_post_code[ 7:0]  <=   io_writedata  ;
  end
end

////////////////////////////////////////////////////////////////////////





endmodule

